const express = require('express');
const mongoose = require('mongoose');

const app = express();
mongoose.connect('mongodb://localhost/myDatabase', { useNewUrlParser: true });
const db = mongoose.connection;

db.on('error', (error) => { console.log(`Connection error: ${error}`); });
db.once('open', () => { console.log('Database connected'); });

// 接下来，需要创建一个模型来表示购物车中的商品： 
const Schema = mongoose.Schema;
// 购物车-商品状态
const CartItemSchema = new Schema({ product: { type: Schema.Types.ObjectId, ref: 'Product', }, quantity: Number, });
// 用户-购物车状态
const CartSchema = new Schema({ user: { type: Schema.Types.ObjectId, ref: 'User', }, items: [CartItemSchema], });
// 暴露出去
const Cart = mongoose.model('Cart', CartSchema);

//  你可以创建如下的 Express routes 来处理购物车相关功能：  
// 添加一个商品到购物车 
app.post('/cart/:productId', async (req, res) => {
  // 用户对应的购物车模块 
  // cart ==>  CartSchema.items
  const cart = await Cart.findOne({ user: req.user._id });
  // CartSchema.items ==> product(通过productid找到对应商品数据)
  const product = await Product.findById(req.params.productId);
  // 对应商品数据的数量
  const item = { product: product._id, quantity: 1, };
  // push到cart.items
  cart.items.push(item);
  // 保存到购物车
  await cart.save();
  // json响应
  res.json({ message: 'Product added to cart' });
});


// 从购物车中删除一个商品
app.delete('/cart/:productId', async (req, res) => {
  const cart = await Cart.findOne({ user: req.user._id });
  // 过滤所有不需要删除的数据
  cart.items = cart.items.filter((item) => item.product.toString() !== req.params.productId);
  // 保存当前数据库里数据
  await cart.save();
  res.json({ message: 'Product removed from cart' });
});


// 查看购物车中的所有商品 
app.get('/cart', async (req, res) => { 
  // 通过用户id找到对应id下购物车信息
  const cart = await Cart.findOne({ user: req.user._id }).populate('items.product'); 
  // 返回所有cart.items
  res.json(cart.items); 
});


// 更新购物车中某商品的数量 
app.put('/cart/:productId', async (req, res) => {
  // 通过用户id找到对应id下购物车信息
  const cart = await Cart.findOne({ user: req.user._id });
  // 找到与要更新的productId相同的数据
  const item = cart.items.find((item) => item.product.toString() === req.params.productId);
  // 判断数据是否已存在
  if (!item) { 
    // status(400)为不存在
    res.status(400).json({ message: 'Product not found in cart' });
  } else {
    // item数量更新为要求数量
    item.quantity = req.body.quantity;  // suppose you send new quantity in request body  
    // 保存进cart    
    await cart.save();
    // 返回已更新提示
    res.json({ message: 'Product quantity updated' });
  }
});